﻿#ifndef __SS_VECTOR_H__
#define __SS_VECTOR_H__
#include "../3dMath/ss3dMathDefine.h"

namespace StarSeeker
{
/////////////////////////////////ssFLOAT3X////////////////////////////////
class ssFLOAT3X : public ssFLOAT3
{
public:
	ssFLOAT3X(void);
	ssFLOAT3X(ssfloat fx, ssfloat fy, ssfloat fz);
	ssFLOAT3X(const ssFLOAT3X &sf3);
	void operator=(const ssFLOAT3X &sf3);

	operator ssfloat* ();
	operator const ssfloat* () const;

	void Set(ssfloat fx, ssfloat fy, ssfloat fz);
	void Set(const ssfloat *fVal);
	void Zero();
	//近似0向量
	bool IsZero(ssfloat eps = Math3D::gc_EPSILON_E6);
	//两个向量近似相等
	bool IsApproximate(const ssFLOAT3X& val, ssfloat eps = Math3D::gc_EPSILON_E6);
	//取反
	void Against();
	//求模
	ssfloat Length() const;
	//求模的平方
	ssfloat SquaredLength() const;
	//单位化
	void Normalize();
	ssFLOAT3X Normalized() const;
	//点乘
	ssfloat Dot(const ssFLOAT3X& val) const;
	//叉乘
	ssFLOAT3X Cross(const ssFLOAT3X& val) const;
	//模近似0
	bool IsZeroLength() const;

	ssFLOAT3X operator + (const ssFLOAT3X& val) const;
	ssFLOAT3X operator - (const ssFLOAT3X& val) const;
	ssFLOAT3X operator * (const ssFLOAT3X& val) const;
	ssFLOAT3X operator / (const ssFLOAT3X& val) const;
	ssFLOAT3X operator + (ssfloat val) const;
	ssFLOAT3X operator - (ssfloat val) const;
	ssFLOAT3X operator * (ssfloat val) const;
	ssFLOAT3X operator / (ssfloat val) const;

	void operator += (const ssFLOAT3X& val);
	void operator -= (const ssFLOAT3X& val);
	void operator *= (const ssFLOAT3X& val);
	void operator /= (const ssFLOAT3X& val);
	void operator *= (ssfloat val);
	void operator /= (ssfloat val);

	bool operator == (const ssFLOAT3X& val) const;
	bool operator != (const ssFLOAT3X& val) const;
};
typedef ssFLOAT3X ssVector3;
typedef ssFLOAT3X ssColor3;
//常量0向量
const ssFLOAT3X cg_zeroFloat3(0.f,0.f,0.f);
///////////////////////////////////////////////////////////////////////////
}
#endif
